#ifndef PROTOCOL_H
#define PROTOCOL_H

typedef unsigned int uint;

#include "defs.h"

#include <stdlib.h>
//#include <unistd.h> // Unix库函数，包含了read等系统服务函数
#include <string.h>


#define REGIST_OK "regist ok"
#define REGIST_FAILED "regist failed: name same"

#define LOGIN_OK "login ok"
#define LOGIN_FAILED "login failed: username or password error"

enum MSG_TYPE
{
    MIN = 0,

    // 用户操作
    REGIST_REQUEST,           // 注册请求
    REGIST_RESPOND,           // 注册回复
    LOGIN_REQUEST,            // 登录请求
    LOGIN_RESPOND,            // 登录回复
    LOGOUT_REQUEST,            // 登录请求
    LOGOUT_RESPOND,            // 登录回复
    UPDATE_USER_REQUEST,      // 更新用户请求
    UPDATE_USER_RESPOND,      // 更新用户回复

    // 动漫操作
    ADD_ANIME_REQUEST,        // 添加动漫请求
    ADD_ANIME_RESPOND,        // 添加动漫回复
    DELETE_ANIME_REQUEST,     // 删除动漫请求
    DELETE_ANIME_RESPOND,     // 删除动漫回复
    UPDATE_ANIME_REQUEST,     // 更新动漫请求
    UPDATE_ANIME_RESPOND,     // 更新动漫回复
    GET_ANIME_BY_NAME_REQUEST, // 通过名称查找动漫请求
    GET_ANIME_BY_NAME_RESPOND, // 通过名称查找动漫回复
    GET_ALL_ANIMES_REQUEST,   // 获取所有动漫请求
    GET_ALL_ANIMES_RESPOND,   // 获取所有动漫回复

    // 浏览操作
    BROWSE_BY_CATEGORY_REQUEST, // 分类浏览请求
    BROWSE_BY_CATEGORY_RESPOND, // 分类浏览回复
    BROWSE_BY_TAG_REQUEST,      // 标签浏览请求
    BROWSE_BY_TAG_RESPOND,      // 标签浏览回复

    // 评论操作
    COMMENT_ANIME_REQUEST,      // 评论动漫请求
    COMMENT_ANIME_RESPOND,      // 评论动漫回复

    // 评论审核
    ACCEPT_COMMENT_ANIME_REQUEST,      // 通过评论动漫请求
    ACCEPT_COMMENT_ANIME_RESPOND,      // 通过评论动漫回复
    REJECT_COMMENT_ANIME_REQUEST,      // 拒绝评论动漫请求
    REJECT_COMMENT_ANIME_RESPOND,      // 拒绝评论动漫回复
    GET_ALL_PENDING_COMMENTS_REQUEST,   // 获取所有待审核评论请求
    GET_ALL_PENDING_COMMENTS_RESPOND,   // 获取所有待审核评论回复

    // 帖子操作
    POST_REQUEST,               // 发帖请求
    POST_RESPOND,               // 发帖回复


    // 帖子审核
    ACCEPT_POST_REQUEST,      // 通过评论动漫请求
    ACCEPT_POST_RESPOND,      // 通过评论动漫回复
    REJECT_POST_REQUEST,      // 拒绝评论动漫请求
    REJECT_POST_RESPOND,      // 拒绝评论动漫回复
    GET_ALL_PENDING_POSTS_REQUEST,   // 获取所有待审核评论请求
    GET_ALL_PENDING_POSTS_RESPOND,   // 获取所有待审核评论回复

    GET_POSTS_REQUEST,          // 获取最新的十条帖子请求
    GET_POSTS_RESPOND,          // 获取最新的十条帖子回复
    POST_COMMENT_REQUEST,       // 评论帖子请求
    POST_COMMENT_RESPOND,       // 评论帖子回复
    LIKE_POST_REQUEST,          // 点赞帖子请求
    LIKE_POST_RESPOND,          // 点赞帖子回复

    GET_POST_ID,                //获取帖子ID
    PIX_FROM_POST_SEND,         //帖子发送图片；
    PIX_FROM_POST_RESPOND,      //图片帖子回复


    MAX = 0x00ffffffff,
};


//协议数据单元格式
struct PBS
{
    uint PBSLen;        // 总的协议数据单元大小
    uint MsgType;       // 消息类型
//    char caData[64];    // 其他数据
    int  Code;
    uint MsgLen;        // 实际消息长度
    char Msg[];          // 动态数据（柔性数组）
};

PBS *mkPBS(uint MsgLen);

PBS* serializeQStringToPBS(const QString& str);
QString deserializePBSToQString(const PBS *pbs);

PBS* serializeUserToPBS(const Core::User& user);
Core::User deserializePBSToUser(const PBS *pbs);

PBS* serializeAnimeToPBS(const Core::Anime& anime);
Core::Anime deserializePBSToAnime(const PBS *pbs);

PBS* serializeAnimesToPBS(const QList<Core::Anime>& animes);
QList<Core::Anime> deserializePBSToAnims(const PBS *pbs);

PBS* serializeCommentToPBS(const Core::Comment& user);
Core::Comment deserializePBSToComment(const PBS *pbs);

PBS* serializePostCommentsToPBS(const QList<Core::Comment>& posts);
QList<Core::Comment> deserializePBSToPostComments(const PBS *pbs);

PBS* serializeFilterToPBS(const Core::Filter& post);
Core::Filter deserializePBSToFilter(const PBS *pbs);

PBS* serializePostToPBS(const Core::Post& post);
Core::Post deserializePBSToPost(const PBS *pbs);

PBS* serializePostsToPBS(const QList<Core::Post>& posts);
QList<Core::Post> deserializePBSToPosts(const PBS *pbs);

PBS* serializePostCommentToPBS(const Core::PostComment& post);
Core::PostComment deserializePBSToPostComment(const PBS *pbs);

PBS* serializeLikePostToPBS(const Core::LikePost& like);
Core::LikePost deserializePBSToLikePost(const PBS *pbs);

PBS* serializePixFromPostToPBS(const Core::PixFromPost& pixFromPost);
Core::PixFromPost deserializePBSToPixFromPost(const PBS *pbs);
#endif // PROTOCOL_H
